/**
 * @File Name: epoller.h
 * @brief  Epoller 类声明
 * @Author : beyon_sir email:caoboyang.chn@gmail.com
 * @Version : 1.0
 * @Create Date : 2022-11-20
 * 
 */
#ifndef EPOLLER_H
#define EPOLLER_H

#include <sys/epoll.h> //epoll_ctl()
#include <fcntl.h>  // fcntl()
#include <unistd.h> // close()
#include <assert.h> // close()
#include <vector>
#include <errno.h>

/// @brief class Epoller 
class Epoller {
public:
    explicit Epoller(int maxEvent = 1024);

    ~Epoller();

    bool AddFd(int fd, uint32_t events);        // 添加要检测的事件

    bool ModFd(int fd, uint32_t events);        // 修改检测的事件信息

    bool DelFd(int fd);                         // 删除要检测的事件

    int Wait(int timeoutMs = -1);               // 调用内核检测事件是否发生

    int GetEventFd(size_t i) const;        

    uint32_t GetEvents(size_t i) const;
        
private:
    int epollFd_;                               // epoll_create()创建一个epoll对象，返回值就是epollFd_                                                 

    std::vector<struct epoll_event> events_;    // 检测到的事件集合
};

#endif //EPOLLER_H